package com.common;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.common.bean.DataEntity;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MybatisPlusGenerate {
    public void GenDB(String table,String service){

        AutoGenerator mpg = new AutoGenerator();
        // =============================全局配置===============================
        GlobalConfig gcon = new GlobalConfig();
        gcon.setAuthor("hzz");
        gcon.setFileOverride(true);
        String gendir=System.getProperty("user.dir")+"/mybatisplus-gen/java";
        gcon.setOutputDir(gendir);
        gcon.setBaseResultMap(true);// XML ResultMap
        gcon.setBaseColumnList(true);// XML columList
        /* 自定义文件命名，注意 %s 会自动填充表实体属性！ */
        gcon.setControllerName("%sController");
        gcon.setServiceName("%sService");
        gcon.setMapperName("%sMapper");
        gcon.setServiceImplName("%sServiceImpl");
        gcon.setXmlName("%sMapper");
        gcon.setSwagger2(true);
        mpg.setGlobalConfig(gcon);
        mpg.setDataSource(new DataSourceConfig()
                // 用户名、密码、驱动、url
                .setUsername("root").setPassword("myadmin")
                .setDbType(DbType.MYSQL).setDriverName("com.mysql.jdbc.Driver")
                .setUrl("jdbc:mysql://localhost:3306/mine?useSSL=true")
                .setTypeConvert(new MySqlTypeConvert() {
                    @Override
                    public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType){
                        if ( fieldType.toLowerCase().contains( "datetime" ) ) {
                            return DbColumnType.DATE;
                        }
                        if ( fieldType.toLowerCase().contains( "tinyint" ) ) {
                            return DbColumnType.INTEGER;
                        }
                        return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
                    }
                })
        );
        // ===============================包名配置：父包.模块.controller===============================
        PackageConfig pc = new PackageConfig();

        pc.setParent("com.teach."+service)// 服务名 模块名
                // 分层包名
        .setController("controller").setService("service").setServiceImpl("service.impl").setEntity("model.entity").setMapper("dao").setXml("model");
        mpg.setPackageInfo(pc);

        // =====================================策略配置==================================
        mpg.setStrategy(new StrategyConfig()
                .setInclude(table)
                // 命名策略：实体的类名和属性名按下划线转驼峰 user_info -> userInfo
                .setNaming(NamingStrategy.underline_to_camel)
                .setColumnNaming(NamingStrategy.underline_to_camel)
                .setRestControllerStyle(true)
                .setLogicDeleteFieldName("state")

                .entityTableFieldAnnotationEnable(true));

        TemplateConfig tc = new TemplateConfig();
        tc.setController("/MPtemplates/controller.java.vm");
        tc.setService("/MPtemplates/service.java.vm");
        tc.setServiceImpl("/MPtemplates/serviceImpl.java.vm");
        tc.setEntity("/MPtemplates/entity.java.vm");
        tc.setMapper("/MPtemplates/mapper.java.vm");
        mpg.setTemplate(tc);
        VelocityTemplateEngine velocityTemplateEngine = new VelocityTemplateEngine();
        mpg.setTemplateEngine(velocityTemplateEngine);
        // ===============================自定义配置===============================
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                System.out.println("initMap");
            }
        };

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        String templatePath ="/MPtemplates/mapper.xml.vm";
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return System.getProperty("user.dir") + "/mybatisplus-gen/resources/mapper/" + service
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        String pagevo ="MPtemplates/po.java.vm";
        focList.add(new FileOutConfig(pagevo) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/teach/"+service+"/model/po/"+tableInfo.getEntityName()+"PO"+ StringPool.DOT_JAVA;
            }
        });
//        String query ="MPtemplates/Query.java.vm";
//        focList.add(new FileOutConfig(query) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/common/bean/Query" + StringPool.DOT_JAVA;
//            }
//        });
//        String queryCondition ="MPtemplates/QueryCondition.java.vm";
//        focList.add(new FileOutConfig(queryCondition) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/common/bean/QueryCondition" + StringPool.DOT_JAVA;
//            }
//        });
//        String Resp = "MPtemplates/Response.java.vm";
//        focList.add(new FileOutConfig(Resp) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/common/bean/Response" + StringPool.DOT_JAVA;
//            }
//        });
//        String mbex ="MPtemplates/MemberException.java.vm";
//        focList.add(new FileOutConfig(mbex) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/common/exception/MemberException" + StringPool.DOT_JAVA;
//            }
//        });
//        String rreex ="MPtemplates/RRException.java.vm";
//        focList.add(new FileOutConfig(rreex) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/common/exception/RRException" + StringPool.DOT_JAVA;
//            }
//        });
//        String dateutil ="MPtemplates/DateUtils.java.vm";
//        focList.add(new FileOutConfig(dateutil) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/common/utils/DateUtils" + StringPool.DOT_JAVA;
//            }
//        });
//        String sqlfilter ="MPtemplates/SQLFilter.java.vm";
//        focList.add(new FileOutConfig(sqlfilter) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/common/utils/SQLFilter" + StringPool.DOT_JAVA;
//            }
//        });
//        String CodeValue ="MPtemplates/CodeValue.java.vm";
//        focList.add(new FileOutConfig(CodeValue) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/common/utils/CodeValue" + StringPool.DOT_JAVA;
//            }
//        });
//        String EnumHelper ="MPtemplates/EnumHelper.java.vm";
//        focList.add(new FileOutConfig(EnumHelper) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/common/utils/EnumHelper" + StringPool.DOT_JAVA;
//            }
//        });
//        String IBaseEnum ="MPtemplates/IBaseEnum.java.vm";
//        focList.add(new FileOutConfig(IBaseEnum) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/common/utils/IBaseEnum" + StringPool.DOT_JAVA;
//            }
//        });
//        String JsonUtils ="MPtemplates/JsonUtils.java.vm";
//        focList.add(new FileOutConfig(JsonUtils) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return System.getProperty("user.dir") + "/mybatisplus-gen/java/com/common/utils/JsonUtils" + StringPool.DOT_JAVA;
//            }
//        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        // 执行生成
        mpg.execute();
    }
    public static void main(String[] args) {
        String []s={"ims_hc_cms_log"};
        for (int i = 0; i < s.length; i++) {
            new MybatisPlusGenerate().GenDB(s[i],"sys");
        }
    }

    private static final Pattern pattern = Pattern.compile("_(\\w)");
    public String lineToHump(String str) {
        if(str==null&&str.equals("")){
            return "";
        }
        StringBuffer sb = new StringBuffer();
        Matcher m = pattern.matcher(str.toLowerCase(Locale.ENGLISH));
        while (m.find()){
            m.appendReplacement(sb,m.group(1).toUpperCase());
        }
        m.appendTail(sb);
        return sb.toString();
    }

}
